home *** CD-ROM | disk | FTP | other *** search
/ Aminet 23 / Aminet 23 (1998)(GTI - Schatztruhe)[!][Feb 1998].iso / Aminet / util / shell / ShellScr.lha / ShellScr / src / args.e < prev    next >
Encoding:
Text File  |  1997-12-15  |  2.9 KB  |  114 lines

  1. OPT MODULE
  2.  
  3. MODULE 'icon', 'dos/rdargs', 'workbench/startup', 'workbench/workbench'
  4.  
  5. EXPORT PROC readargs(template:PTR TO CHAR, args, wbmsg:PTR TO wbstartup) HANDLE
  6.   DEF rdargs=NIL, m,n,p,  arglst=NIL:PTR TO LONG, tt:PTR TO LONG,
  7.       tstr, name, val, wb_arg=NIL:PTR TO wbarg,  dobj=NIL:PTR TO diskobject, olddir
  8.  
  9.   -> If run from shell, then use shell args
  10.   IF wbmsg=NIL
  11.     RETURN ReadArgs(template, args, NIL)
  12.   ENDIF
  13.  
  14.   -> make a big enough list for all name/value pairs for template
  15.   m:=1; FOR n:=0 TO StrLen(template)-1 DO IF template[n]="," THEN INC m
  16.   IF (arglst:=List(m*2))=NIL THEN Raise("MEM")
  17.   SetList(arglst,ListMax(arglst))
  18.  
  19.  
  20.   -> Go through all tooltypes in all selected icons
  21.   IF (iconbase:=OpenLibrary('icon.library',36))=NIL THEN Raise("LIB")
  22.   wb_arg:=wbmsg.arglist
  23.   FOR m:=0 TO wbmsg.numargs-1
  24.     olddir:=CurrentDir(wb_arg.lock)
  25.     dobj:=GetDiskObjectNew(wb_arg.name)
  26.     CurrentDir(olddir)
  27.     tt:=dobj.tooltypes; n:=0
  28.     WHILE tstr:=tt[n++]
  29.  
  30.       -> split up tooltype
  31.       name,val:=ttsplit(tstr)
  32.       -> if in template, place into appropriate list entry
  33.       IF (p:=FindArg(template, name))<>-1
  34.         IF arglst[p*2  ] THEN DisposeLink(arglst[p*2  ])
  35.         IF arglst[p*2+1] THEN DisposeLink(arglst[p*2+1])
  36.         arglst[p*2  ]:=name
  37.         arglst[p*2+1]:=val
  38.       ELSE
  39.         DisposeLink(name)
  40.         DisposeLink(val)
  41.       ENDIF
  42.  
  43.     ENDWHILE
  44.     FreeDiskObject(dobj); dobj:=NIL
  45.     wb_arg++
  46.   ENDFOR
  47.  
  48.   
  49.   m:=1 -> calculate length of final 'arg string' to be parsed by ReadArgs()
  50.   FOR n:=0 TO ListLen(arglst)-1 DO IF p:=arglst[n] THEN m:=m+EstrLen(p)+3
  51.   IF (m:=String(m))=NIL THEN Raise("MEM")
  52.   StrCopy(m,'')
  53.  
  54.   -> concatenate final arg settings into one big string
  55.   FOR n:=0 TO ListLen(arglst)-1
  56.     IF p:=arglst[n]
  57.       IF InStr(p,' ')=-1
  58.         StrAdd(m,p)
  59.         StrAdd(m,' ')
  60.       ELSE        
  61.         StrAdd(m,'"')
  62.         StrAdd(m,p)
  63.         StrAdd(m,'" ')
  64.       ENDIF
  65.     ENDIF
  66.   ENDFOR
  67.  
  68.   rdargs:=ReadArgs(template,args,[m,EstrLen(m),0,NIL,NIL,0,NIL,RDAF_NOPROMPT])
  69.   DisposeLink(tstr)
  70.  
  71.   Raise()
  72. EXCEPT DO
  73.   IF arglst
  74.     FOR n:=0 TO ListLen(arglst) DO IF p:=arglst[n] THEN DisposeLink(p)
  75.     DisposeLink(arglst)
  76.   ENDIF
  77.   IF dobj THEN FreeDiskObject(dobj)
  78.   IF iconbase THEN CloseLibrary(iconbase)
  79.   ReThrow()
  80. ENDPROC rdargs
  81.  
  82. PROC ttsplit(s:PTR TO CHAR)
  83.   -> of something 'blah=foo', returns 'blah','foo'
  84.   -> of something 'blah', returns 'blah',NIL
  85.   -> of something beginning '(', 'IM1=' or 'IM2=', returns NIL,NIL
  86.  
  87.   DEF div,len,l,r
  88.  
  89.   IF s=NIL THEN RETURN NIL,NIL
  90.   IF (s[0]="(") OR (InStr(s,'IM1=')=0) OR (InStr(s,'IM2=')=0) THEN
  91.     RETURN NIL,NIL
  92.  
  93.   len:=StrLen(s)
  94.   div:=InStr(s,'=')
  95.  
  96.   IF div=-1
  97.     l:=String(len)
  98.     IF l THEN StrCopy(l,s)
  99.     RETURN l,NIL
  100.   ENDIF
  101.  
  102.   l:=String(div+1)
  103.   r:=String(len-div)
  104.  
  105.   IF (l AND r)=NIL
  106.     IF l THEN DisposeLink(l)
  107.     IF r THEN DisposeLink(r)
  108.     RETURN NIL,NIL
  109.   ENDIF
  110.  
  111.   MidStr(l,s,0,div) 
  112.   MidStr(r,s,div+1) 
  113. ENDPROC l,r
  114.